home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / lib / mntlib44.zoo / mntlib / wait3.c < prev    next >
C/C++ Source or Header  |  1993-10-20  |  2KB  |  82 lines

  1. /* wait3() emulation for MiNT. written by Eric R. Smith and placed in
  2.    the public domain
  3.  */
  4.  
  5. #include <types.h>
  6. #include <wait.h>
  7. #include <time.h>
  8. #include <resource.h>
  9. #include <mintbind.h>
  10. #include <errno.h>
  11. #include <signal.h>
  12.  
  13. extern int __mint;
  14.  
  15. extern long __waitval;        /* in thread.c */
  16. extern long __waittime;        /* ditto */
  17.  
  18. __EXTERN void _bzero __PROTO((void *, unsigned long));
  19.  
  20. __EXTERN void _ms2tval __PROTO((unsigned long, struct timeval *));
  21.         /* in getrusage.c */
  22.  
  23. pid_t
  24. wait3(status, mode, rusage)
  25.     union wait *status;
  26.     int mode;
  27.     struct rusage *rusage;
  28. {
  29.     long r, rsc[8];
  30.     int exit_status, sig_term, pid;
  31.  
  32.     if (__mint == 0) {
  33.         r = __waitval;
  34.         __waitval = -ENOENT;
  35.         rsc[0] = __waittime;
  36.         rsc[1] = rsc[4] = 0;
  37.     } else
  38.         r = Pwaitpid(-1, mode, rsc);
  39.     if (r < 0) {
  40.         errno = (int) -r;
  41.         return -1;
  42.     }
  43.     pid = (int) ((r & 0xffff0000L) >> 16);
  44.     if (pid) {
  45.       if (status)
  46.         {
  47.         status->_i = 0;
  48.  
  49.         if ( ((short)r) == -32) {
  50.             sig_term = SIGINT;
  51.             exit_status = 0;
  52.         }
  53.         else {
  54.             exit_status = (int) (r & 0x000000ffL);
  55.             sig_term = (int) ((r & 0x00007f00L) >> 8);
  56.         }
  57.         if (sig_term >= NSIG)
  58.           sig_term = 0;
  59.         if (sig_term && exit_status != 0 && exit_status != 0177)
  60.             sig_term = 0;
  61.         if (exit_status == 0177 && sig_term) {
  62.             status->w_termsig = WSTOPPED;
  63.             status->w_stopsig = sig_term;
  64.         }
  65.         else {
  66.             status->w_termsig = sig_term;
  67.             status->w_retcode = exit_status;
  68.         }
  69.         }
  70.  
  71.         if (rusage) {
  72.             _bzero(rusage,
  73.                    (unsigned long) (sizeof (struct rusage)));
  74.             _ms2tval(rsc[0], &(rusage->ru_utime));
  75.             _ms2tval(rsc[1], &(rusage->ru_stime));
  76.             /* Kludge so GNU time will configure properly: */
  77.             rusage->ru_nvcsw = 1;
  78.         }
  79.     }
  80.     return pid;
  81. }
  82.